home *** CD-ROM | disk | FTP | other *** search
/ OpenGL Superbible (2nd Edition) / OpenGL SuperBible e2.iso / tools / GLUT-3.7 / PROGS / DEMOS / rollercoaster / MATRIX.C < prev    next >
Encoding:
C/C++ Source or Header  |  1998-08-12  |  1.9 KB  |  114 lines

  1. #include "matrix.h"
  2. #include "math.h"
  3.  
  4. void init_matrix(Matrix *m)
  5. {
  6.     int i,j;
  7.     for (i=0;i<4;i++)
  8.     for (j=0;j<4;j++)
  9.         m->index[i][j] = (i==j?1:0);
  10. }
  11.  
  12. void init_vector(Vector *v)
  13. {
  14.     int i;
  15.     for (i=0;i<3;i++)
  16.     v->index[i] = 0;
  17.     v->index[3] = 1;
  18. }
  19.  
  20. void copy_vector(Vector *v1, Vector *v2)
  21. {
  22.     int i;
  23.     for (i=0;i<4;i++)
  24.     v1->index[i] = v2->index[i];
  25. }
  26.  
  27. void copy_matrix(Matrix *m1, Matrix *m2)
  28. {
  29.     int i,j;
  30.     for (i=0;i<4;i++)
  31.     for (j=0;j<4;j++)
  32.         m1->index[i][j] = m2->index[i][j];
  33. }
  34.  
  35. void multiply_vector_matrix(Matrix *m, Vector *v)
  36. {
  37.     int i,j;
  38.     Vector t;
  39.     for (i=0;i<4;i++)
  40.     {
  41.     t.index[i] = 0;
  42.     for (j=0;j<4;j++)
  43.         t.index[i] += m->index[i][j] * v->index[j];
  44.     }
  45.     copy_vector(v, &t);
  46. }
  47.  
  48. void multiply_matrix_vector(Matrix *m, Vector *v)
  49. {
  50.     int i,j;
  51.     Vector t;
  52.     for (i=0;i<4;i++)
  53.     {
  54.     t.index[i] = 0;
  55.     for (j=0;j<4;j++)
  56.         t.index[i] += m->index[j][i] * v->index[j];
  57.     }
  58.     copy_vector(v, &t);
  59. }
  60.  
  61. void multiply_matrix(Matrix *m2, Matrix *m1)
  62. {
  63.     int i,j,k;
  64.     Matrix m;
  65.     for (i=0;i<4;i++)
  66.     {
  67.     for (j=0;j<4;j++)
  68.     {
  69.         m.index[i][j] = 0;
  70.         for (k=0;k<4;k++)
  71.         m.index[i][j] += m1->index[i][k]* m2->index[k][j];
  72.     }
  73.     }
  74.     copy_matrix(m2, &m);
  75. }
  76.  
  77. void rotate_x(double angle, Matrix *m)
  78. {
  79.     Matrix r;
  80.     double c = cos(angle), s = sin(angle);
  81.     init_matrix(&r);
  82.     r.index[1][1] = c;
  83.     r.index[1][2] = s;
  84.     r.index[2][1] = -s;
  85.     r.index[2][2] = c;
  86.     multiply_matrix(m, &r);
  87. }
  88.  
  89. void rotate_y(double angle, Matrix *m)
  90. {
  91.     Matrix r;
  92.     double c = cos(angle), s = sin(angle);
  93.     init_matrix(&r);
  94.     r.index[0][0] = c;
  95.     r.index[0][2] = -s;
  96.     r.index[2][0] = s;
  97.     r.index[2][2] = c;
  98.     multiply_matrix(m, &r);
  99. }
  100.  
  101. void rotate_z(double angle, Matrix *m)
  102. {
  103.     Matrix r;
  104.     double c = cos(angle), s = sin(angle);
  105.     init_matrix(&r);
  106.     r.index[0][0] = c;
  107.     r.index[0][1] = s;
  108.     r.index[1][0] = -s;
  109.     r.index[1][1] = c;
  110.     multiply_matrix(m, &r);
  111. }
  112.  
  113. void mcount() {}
  114.